package com.testing.class10;

import com.testing.class9.Animal;

/**
 * @Classname TestMulti
 * @Description 类型说明
 * @Date 2021/5/7 20:06
 * @Created by 特斯汀Roy
 */
public class TestMulti {

    public static void main(String[] args) {
        //产生一只是兔子的动物。
        //父类引用指向子类对象。
        //引用地址：就是父类所使用的内存地址。 内存中存放的其实是个子类对象。
        Animal ar=new Rabbit();
        Animal ac=new Cat();
        System.out.println(ar);

        //多态的产生。
        //向上转型的对象，调用子类重写的方法的时候，用的是子类已经重写的方法。
        ar.eating();
        ac.eating();

        //子类对象向上转型之后，会失去自己扩展的方法。不能进行调用。
//        ar.jump();
//        ac.sleep();

        //向下转型
        //通过强制转换，进行向下转型，转换成原本的子类对象
        //把这只动物，重新称为兔子
        Rabbit rabbit=(Rabbit)ar;
        rabbit.jump();

        //运算符优先级，.是最高级别的运算符
        //提升类型转换的优先级。先向下转型，然后再进行调用
        ((Cat)ac).sleep();

//        //编译器并不会报错。执行过程才会报错，这也是为什么要强制转换。
//        Cat wrongcat= (Cat)ar;
//        wrongcat.sleep();

        //多态的体现：同样的动物，当人类进行喂食的时候产生不一样的效果。
        Feeder roy=new Feeder();
        roy.feedAnimal(ar);
        roy.feedAnimal(ac);

        //向上转型的对象，调用的属性是父类的变量值
        System.out.println("向上转型的父类对象调用kind属性的结果："+ar.kind);
        //向下转型之后，调用的属性是子类的变量值。
        System.out.println("向下转型的子类对象调用kind属性的结果："+((Rabbit)ar).kind);


    }


}
